/*
 * Copyright (C) 2019 ~ 2022 Uniontech Software Technology Co.,Ltd.
 *
 * Author:     yanghongwei <yanghongwei@uniontech.com>
 *
 * Maintainer: yanghongwei <yanghongwei@uniontech.com>
 */

#include "switch_scene_model.h"

SwitchSceneModel::SwitchSceneModel(QObject *parent)
    : QObject(parent)
    , m_currentScene(Scene::InternalScene)
    , m_waitScene(Scene::None)
    , m_processScene(Scene::None)
    , m_canConnectInternal(true)
{
}

SwitchSceneModel::~SwitchSceneModel()
{
}

bool SwitchSceneModel::canSwitchScene(const Scene &scene)
{
    return (scene == Scene::InternalScene) ? m_canConnectInternal : !m_canConnectInternal;
}

void SwitchSceneModel::switchScene(const Scene &scene)
{
    // 有等待处理完成的场所，缓存该场景
    if (m_processScene != Scene::None) {
        m_waitScene = scene;
        return;
    }

    m_waitScene = Scene::None;
    // 当前场所一致不处理
    if (m_currentScene == scene) {
        emit switchSceneFinished(true, m_currentScene);
        return;
    }

    m_processScene = scene;
    // TODO:切换场所接口调用
    //  void SwitchScene(int sceneType); // 切换场景
}

void SwitchSceneModel::requestSwitchSceneFinished(int sceneType)
{
    // TODO:先不管这个值是否超出我的范围
    if (m_currentScene != Scene(sceneType)) {
        m_currentScene = Scene(sceneType);
        emit switchSceneFinished(true, m_currentScene);
    }
    // 处理中的场所切换完成
    // TODO:超时需要处理m_processScene
    if (m_processScene != Scene::None && m_processScene == m_currentScene) {
        m_processScene = Scene::None;
    }

    // 存在等待处理中的场所，切换场所
    if (m_waitScene != Scene::None) {
        switchScene(m_waitScene);
    }
}

void SwitchSceneModel::timeOut()
{
    m_processScene = Scene::None;
    emit switchSceneFinished(false, m_currentScene);

    // 存在等待处理中的场所，切换场所
    if (m_waitScene != Scene::None) {
        switchScene(m_waitScene);
    }
}

void SwitchSceneModel::networkChanged()
{
    // vpn 网络等处理结果的反馈
    m_canConnectInternal = true;
}